package orm

import (
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// 实体之间外键关联: 1 v 1
type Dept struct {
	// 继承 gorm中的 Model
	gorm.Model
	Name string
	// autoCreateTime | autoUpdateTime 自动插入时间戳
	Version time.Time `gorm:"autoCreateTime"`
}

var db5 *gorm.DB

func init() {
	dsn := "root:root@tcp(localhost:3306)/go_db?charset=utf8mb4&parseTime=true"
	// 全局跳过 事务
	db1, err := gorm.Open(mysql.Open(dsn), &gorm.Config{SkipDefaultTransaction: true})
	if err != nil {
		panic("failed to connect database")
	}
	db5 = db1
}

func session() {
	// session 级别跳过事务
	db5 = db5.Session(&gorm.Session{SkipDefaultTransaction: true})
}

func main() {
	// 创建外键表
	insert7()
}

// 不加事务
func insert5() {
	// Create
	db5.Create(&Dept{Name: "里斯12"})
	db5.Create(nil)

	// 结果第一条数据插入成功，第二条插入失败
}

// 手动事务
func insert6() {

	tx := db5.Begin()
	tx.Create(&Dept{Name: "里斯13"})
	if err := tx.Create(nil).Error; err != nil {
		// 事务回滚
		tx.Rollback()
	} else {
		// 事务提交
		tx.Commit()
	}
}

// 使用事务控制
func insert7() {

	db5.Transaction(func(tx *gorm.DB) error {
		if err := tx.Create(&Dept{Name: "里斯13"}).Error; err != nil {
			return err
		}
		if err := tx.Create(nil).Error; err != nil {
			return err
		}
		return nil
	})

}
